其他
【Tidyverse优雅编程】:整洁数据统计分析流程案例
来自知乎问题:
如何用R画分组柱状图并且添加标准差和显著性标记(星号)?
https://www.zhihu.com/question/59517660/answer/2838254742
我看到其中 Shawn Wang 的回答,代码的陈旧啰嗦程度实在是看不下去,通篇:
还在用史前的
reshape2
做数据重塑,逐元素 `for` 循环,没有操作数据的思维
base R 为主,又间杂着 tidyverse 的
ggplot()
,filter()
等,不伦不类
我用 tidyverse
全部改写了一遍,看看如今 R 语言是如何整洁优雅的做数据统计分析的。
加载包:
library(tidyverse)
library(rstatix) # 整洁统计检验
生成模拟数据:
set.seed(123)
df = tibble(Sample = rep(c("A","B","C"), each = 7),
root = c(rnorm(7,10), rnorm(7,5), rnorm(7,21)),
leaf = c(rnorm(7,9), rnorm(7,4), rnorm(7,32)),
stem = rnorm(21,8))
df
数据重塑:宽变长
df1 = df %>%
pivot_longer(-1, names_to = "Tissue", values_to = "value")
df1
分组正态性检验
df1 %>%
group_by(Sample, Tissue) %>%
shapiro_test(value)
注:原来是列名命名的问题,直接分组统计检验是可以的。不必用批量建模的思路。
批量绘制Q-Q图(分面就行):
ggplot(df1, aes(sample = value)) +
stat_qq() +
stat_qq_line(color = "red") +
facet_wrap(Sample ~ Tissue, scales = "free")
准备画图数据(分组汇总):
df2 = df1 %>%
group_by(Tissue, Sample) %>%
summarise(mu = mean(value), se = sd(value))
df2
绘制复试条形图,并标记:
df2 %>%
ggplot(aes(Tissue, mu, fill = Sample)) +
geom_col(position = "dodge") +
geom_errorbar(aes(ymax = mu + se, ymin = mu - se), width = 0.15,
position = position_dodge(0.9)) +
ylim(0, 40) +
geom_segment(x = 0.7, y = 8.817302+3, xend = 0.7 , yend = 32.302470+3) +
geom_segment(x = 0.7, y = 32.302470+3, xend = 1.3, yend = 32.302470+3) +
geom_segment(x = 1.3, y = 32.302470+3, xend = 1.3, yend = 32.302470+2) +
annotate("text", x = 1, y = 32.302470 + 4, label = "***")
附录
学习全网最新的 R 语言编程技术,掌握真正的数据编程思维:
你只需要收看这份《R语言编程:基于tidyverse》完整课件!
下载地址:
链接:https://pan.baidu.com/s/1w6FDFndUuHcI8RngIOe49g?pwd=3yee
提取码:3yee
欢迎转发与推广!
本书的 电子网页版 和 纸质版预售 已上线(人邮)异步社区,可在异步社区公众号或官网购买,纸质版预计1月中旬上市:
https://www.epubit.com/bookDetails?id=UB7db2c0db9f537&tabName=%E6%8A%A2%E8%AF%BB%E7%89%88&floorName=%E7%B2%BE%E9%80%89%E7%BA%B8%E4%B9%A6